#include <memory>
#include <iostream>
using namespace std;

struct Node
{
    int data;
    std::unique_ptr<Node> next;

    ~Node()
    {
        cout << "dtor: " << data << endl;
    }
};

struct List
{
    std::unique_ptr<Node> head;

    void push(int data)
    {
        head = std::unique_ptr<Node>(new Node{data, std::move(head)});
    }
    // 如果没有手写析构函数，那么List在析构的时候会从头析构，而前一个节点依赖后一个节点，
    // 只能通过递归压栈，数量多可能会导致stack-overflow(栈溢出)。
    ~List()
    {
        // 手工从头开始删，析构顺序是逆序
        while(head)
            head = std::move(head->next);
    }
};

int main()
{
    List wall;
    for (int beer = 0; beer != 100000; ++beer)
    {
        wall.push(beer);
    }
}